// bin文件转换成C数组,单个文件处理
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <errno.h>

int main(int argc, char *argv[]) {
    // 参数检查
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <input.bin> <output.c>\n", argv[0]);
        return EXIT_FAILURE;
    }

    const char *input_file = argv[1];
    const char *output_file = argv[2];
    
    FILE *bin_file = fopen(input_file, "rb");
    if (!bin_file) {
        perror("❌ Error opening input file");
        return EXIT_FAILURE;
    }
    
    // 获取文件大小（精确指定数组长度）
    fseek(bin_file, 0, SEEK_END);
    long file_size = ftell(bin_file);
    if (file_size < 0) {
        perror("❌ Error getting file size");
        fclose(bin_file);
        return EXIT_FAILURE;
    }
    rewind(bin_file);

    FILE *c_file = fopen(output_file, "w");
    if (!c_file) {
        perror("❌ Error creating output file");
        fclose(bin_file);
        return EXIT_FAILURE;
    }

    // 写入带尺寸声明的数组定义
    fprintf(c_file, "const uint8_t bin_data[%ld] = {\n    ", file_size);
    
    // 处理二进制数据
    uint8_t byte;
    int byte_count = 0;
    int line_length = 0;
    const int max_per_line = 16;
    
    while ((byte_count < file_size) && (fread(&byte, 1, 1, bin_file) == 1)) {
        // 格式化输出（每行16个字节）
        if (line_length > 0) {
            fprintf(c_file, ", ");
        }
        
        if (line_length >= max_per_line) {
            fprintf(c_file, "\n    ");
            line_length = 0;
        }
        
        fprintf(c_file, "0x%02X", byte);
        byte_count++;
        line_length++;
    }

    // 文件结束处理
    fprintf(c_file, "\n};\n\n");
    
    // 清理资源
    fclose(bin_file);
    fclose(c_file);
    
    printf("✅ Conversion complete: %ld bytes => %s\n", file_size, output_file);
    return EXIT_SUCCESS;
}